import { CreepRole, RoleCreep } from "@/role/types/role"
import { serializePos, unserializePos } from "@/utils"

/**
 * 移动到 source 旁丢弃能量的位置
 * @param creep 执行移动的单位
 */
export const goToDropPos = function (creep: Creep, source: Source): {
    // 本次移动的返回值
    result: ScreepsReturnCode
    // 移动的目的地（之前没有丢弃位置的话目标就为 source，否则为对应的能量丢弃位置）
    targetPos: RoomPosition
    // 要移动到的范围
    range: number
} {
    let targetPos: RoomPosition
    let range = 0

    // 尝试从缓存里读位置
    const standPos = creep.memory.data['standPos']
    if (standPos) {
        targetPos = unserializePos(standPos)
    }
    else {
        const { pos: droppedPos } = source.getDroppedInfo()
        // 之前就已经有点位了，自己保存一份
        if (droppedPos) creep.memory.data['standPos'] = serializePos(droppedPos)
        // 没有点位的话就要移动到 source，调整移动范围
        else range = 1

        targetPos = droppedPos ? droppedPos : source.pos
    }

    // 到了就不进行移动了
    if (creep.pos.isEqualTo(targetPos)) return { result: OK, targetPos, range }

    // 执行移动
    const result = creep.goTo(targetPos, { range, checkTarget: false })
    return { result, targetPos, range }
}
